package main

import (
	"log"
	"time"

	"client2/config"
	"client2/mqtt"
)

// MQTT 连接测试程序
// 用途: 测试 MQTT 客户端连接（不需要传感器硬件）
func main() {
	log.Println("=== MQTT 连接测试 ===")
	log.Println()

	// 1. 加载配置
	cfg := config.DefaultConfig()
	deviceCfg := config.LoadDeviceConfig()

	log.Printf("设备 ID: %s", deviceCfg.DeviceID)
	log.Printf("MQTT Broker: %s", cfg.MQTT.Broker)
	log.Println()

	// 2. 模拟 JWT token（实际应通过 ZKP 认证获取）
	token := "test_token_for_mqtt_connection"
	log.Println("⚠️  使用测试 token（生产环境应使用 ZKP 认证获取的 JWT token）")
	log.Println()

	// 3. 创建 MQTT 客户端
	mqttConfig := &mqtt.Config{
		Broker:   cfg.MQTT.Broker,
		ClientID: deviceCfg.DeviceID,
		Username: cfg.MQTT.Username,
		Password: token,
		QoS:      cfg.MQTT.QoS,
		Retained: cfg.MQTT.Retained,
	}

	log.Println("正在连接 MQTT Broker...")
	client, err := mqtt.NewClient(mqttConfig, token)
	if err != nil {
		log.Fatalf("❌ MQTT 连接失败: %v", err)
	}
	defer client.Disconnect()

	log.Println("✅ MQTT 客户端连接成功")
	log.Println()

	// 4. 创建发布器
	publisher := mqtt.NewPublisher(client)

	// 5. 发布设备上线状态
	log.Println("📤 发布设备上线状态...")
	status := &mqtt.DeviceStatus{
		DeviceID:  deviceCfg.DeviceID,
		Status:    "online",
		Timestamp: time.Now(),
		Metadata: map[string]interface{}{
			"test":    true,
			"version": "1.0.0",
		},
	}
	if err := publisher.PublishDeviceStatus(status); err != nil {
		log.Printf("❌ 发布状态失败: %v", err)
	} else {
		log.Println("✅ 设备状态发布成功")
	}
	time.Sleep(1 * time.Second)

	// 6. 发布测试传感器数据
	log.Println("📤 发布测试传感器数据...")
	tempData := &mqtt.SensorData{
		DeviceID:   deviceCfg.DeviceID,
		SensorType: "temperature",
		Value:      25.5,
		Unit:       "°C",
		Timestamp:  time.Now(),
		Quality:    100,
	}
	if err := publisher.PublishSensorData(tempData); err != nil {
		log.Printf("❌ 发布温度数据失败: %v", err)
	} else {
		log.Println("✅ 温度数据发布成功")
	}

	humidityData := &mqtt.SensorData{
		DeviceID:   deviceCfg.DeviceID,
		SensorType: "humidity",
		Value:      65.0,
		Unit:       "%RH",
		Timestamp:  time.Now(),
		Quality:    100,
	}
	if err := publisher.PublishSensorData(humidityData); err != nil {
		log.Printf("❌ 发布湿度数据失败: %v", err)
	} else {
		log.Println("✅ 湿度数据发布成功")
	}

	log.Println()
	log.Println("============================================================")
	log.Println("✅ MQTT 连接测试完成！")
	log.Println("============================================================")
	log.Println()
	log.Println("📡 验证步骤:")
	log.Println("  在 Edge 服务器上运行以下命令查看数据:")
	log.Println()
	log.Println("  # 查看所有传感器数据")
	log.Println("  mosquitto_sub -h 172.18.2.214 -t 'sensors/#' -v")
	log.Println()
	log.Println("  # 查看设备状态")
	log.Println("  mosquitto_sub -h 172.18.2.214 -t 'devices/+/status' -v")
	log.Println()

	// 保持连接 5 秒
	log.Println("等待 5 秒确保所有消息发送完成...")
	time.Sleep(5 * time.Second)
}
